/**
 * 腾讯地图WebService API封装
 * 提供IP定位、地址解析与逆地址解析等地图服务
 */
import {http} from '@/utils/request';
//获取用户最后访问的城市
export const getLastLocation = (userId) => {
    return http.get(`/api/lastcity/${userId}`);
};
//保存用户最后访问的城市
export const saveLastLocation = (data) => {
    return http.post(`/api/lastcity`, data);
};
// 腾讯地图开发者密钥
const KEY = 'UPXBZ-OY4KZ-S3SX4-7GXOU-ZDJ2J-4CFG4';

// API基础URL
const BASE_URL = 'https://apis.map.qq.com/ws';

/**
 * 通过IP定位当前位置
 * @returns {Promise} 返回定位结果
 */
export const getLocationByIp = () => {
  return new Promise((resolve, reject) => {
    uni.request({
      url: `${BASE_URL}/location/v1/ip`,
      data: {
        key: KEY,
        output: 'json'
      },
      method: 'GET',
      success: (res) => {
        if (res.statusCode === 200 && res.data && res.data.status === 0) {
          resolve(res.data);
        } else {
          reject(new Error(res.data?.message || '获取位置信息失败'));
        }
      },
      fail: (err) => {
        reject(new Error('IP定位请求失败: ' + JSON.stringify(err)));
      }
    });
  });
};

/**
 * 逆地址解析（坐标转地址）
 * @param {Object} options 参数对象
 * @param {Number} options.latitude 纬度
 * @param {Number} options.longitude 经度
 * @param {Number} options.get_poi 是否返回周边POI列表
 * @returns {Promise} 返回解析结果
 */
export const reverseGeocoder = (options) => {
  return new Promise((resolve, reject) => {
    const { latitude, longitude, get_poi = 0 } = options;
    
    if (!latitude || !longitude) {
      reject(new Error('缺少必要的坐标参数'));
      return;
    }

    uni.request({
      url: `${BASE_URL}/geocoder/v1/`,
      data: {
        key: KEY,
        location: `${latitude},${longitude}`,
        get_poi: get_poi,
        output: 'json'
      },
      method: 'GET',
      success: (res) => {
        if (res.statusCode === 200 && res.data && res.data.status === 0) {
          resolve(res.data);
        } else {
          reject(new Error(res.data?.message || '逆地址解析失败'));
        }
      },
      fail: (err) => {
        reject(new Error('逆地址解析请求失败: ' + JSON.stringify(err)));
      }
    });
  });
};

/**
 * 地址解析（地址转坐标）
 * @param {Object} options 参数对象
 * @param {String} options.address 地址
 * @param {String} options.region 地址所在城市（可选）
 * @returns {Promise} 返回解析结果
 */
export const geocoder = (options) => {
  return new Promise((resolve, reject) => {
    const { address, region } = options;
    
    if (!address) {
      reject(new Error('缺少必要的地址参数'));
      return;
    }

    const data = {
      key: KEY,
      address: address,
      output: 'json'
    };

    // 如果提供了region参数，添加到请求中
    if (region) {
      data.region = region;
    }

    uni.request({
      url: `${BASE_URL}/geocoder/v1/`,
      data: data,
      method: 'GET',
      success: (res) => {
        if (res.statusCode === 200 && res.data && res.data.status === 0) {
          resolve(res.data);
        } else {
          reject(new Error(res.data?.message || '地址解析失败'));
        }
      },
      fail: (err) => {
        reject(new Error('地址解析请求失败: ' + JSON.stringify(err)));
      }
    });
  });
};

/**
 * 周边POI搜索
 * @param {Object} options 参数对象
 * @param {Number} options.latitude 纬度
 * @param {Number} options.longitude 经度
 * @param {String} options.keyword 搜索关键词
 * @param {Number} options.radius 搜索半径（米），默认1000米
 * @param {Number} options.page_size 每页条数，默认10条
 * @param {Number} options.page_index 页码，默认第1页
 * @returns {Promise} 返回搜索结果
 */
export const searchNearby = (options) => {
  return new Promise((resolve, reject) => {
    const { 
      latitude, 
      longitude, 
      keyword, 
      radius = 1000, 
      page_size = 10, 
      page_index = 1 
    } = options;
    
    if (!latitude || !longitude) {
      reject(new Error('缺少必要的坐标参数'));
      return;
    }

    if (!keyword) {
      reject(new Error('缺少必要的关键词参数'));
      return;
    }

    uni.request({
      url: `${BASE_URL}/place/v1/search`,
      data: {
        key: KEY,
        keyword: keyword,
        boundary: `nearby(${latitude},${longitude},${radius},0)`,
        page_size: page_size,
        page_index: page_index,
        output: 'json'
      },
      method: 'GET',
      success: (res) => {
        if (res.statusCode === 200 && res.data && res.data.status === 0) {
          resolve(res.data);
        } else {
          reject(new Error(res.data?.message || '周边搜索失败'));
        }
      },
      fail: (err) => {
        reject(new Error('周边搜索请求失败: ' + JSON.stringify(err)));
      }
    });
  });
};

/**
 * 获取城市列表
 * @returns {Promise} 返回城市列表
 */
export const getCityList = () => {
  return new Promise((resolve, reject) => {
    uni.request({
      url: `${BASE_URL}/district/v1/list`,
      data: {
        key: KEY,
        output: 'json'
      },
      method: 'GET',
      success: (res) => {
        if (res.statusCode === 200 && res.data && res.data.status === 0) {
          resolve(res.data);
        } else {
          reject(new Error(res.data?.message || '获取城市列表失败'));
        }
      },
      fail: (err) => {
        reject(new Error('获取城市列表请求失败: ' + JSON.stringify(err)));
      }
    });
  });
};

/**
 * 获取指定城市的区县列表
 * @param {String} id 城市ID
 * @returns {Promise} 返回区县列表
 */
export const getDistrictByCityId = (id) => {
  return new Promise((resolve, reject) => {
    if (!id) {
      reject(new Error('缺少必要的城市ID参数'));
      return;
    }

    uni.request({
      url: `${BASE_URL}/district/v1/getchildren`,
      data: {
        key: KEY,
        id: id,
        output: 'json'
      },
      method: 'GET',
      success: (res) => {
        if (res.statusCode === 200 && res.data && res.data.status === 0) {
          resolve(res.data);
        } else {
          reject(new Error(res.data?.message || '获取区县列表失败'));
        }
      },
      fail: (err) => {
        reject(new Error('获取区县列表请求失败: ' + JSON.stringify(err)));
      }
    });
  });
};

/**
 * 关键词输入提示
 * @param {Object} options 参数对象
 * @param {String} options.keyword 搜索关键词
 * @param {String} options.region 搜索区域，例如"北京"
 * @returns {Promise} 返回提示结果
 */
export const getSuggestion = (options) => {
  return new Promise((resolve, reject) => {
    const { keyword, region = '全国' } = options;
    
    if (!keyword) {
      reject(new Error('缺少必要的关键词参数'));
      return;
    }

    uni.request({
      url: `${BASE_URL}/place/v1/suggestion`,
      data: {
        key: KEY,
        keyword: keyword,
        region: region,
        output: 'json'
      },
      method: 'GET',
      success: (res) => {
        if (res.statusCode === 200 && res.data && res.data.status === 0) {
          resolve(res.data);
        } else {
          reject(new Error(res.data?.message || '获取输入提示失败'));
        }
      },
      fail: (err) => {
        reject(new Error('获取输入提示请求失败: ' + JSON.stringify(err)));
      }
    });
  });
};
